// 一个数组X,其中存有N 个数字，只允许遍历这个数组一遍。

// 问有没有可能计算这些数字的方差。

// 思路：方差计算公式为：DX2 = E (X- EX) 2  这个公式是无法一次遍历就可求出方差的，需要遍历两次。

// 但方差公式还有个变形：DX2 = EX2- (EX) 2，利用这个公式即可以遍历一次求出方差。


#include <iostream>
using namespace std;
//使用基本方法  DX2= E( (X-EX)2 )
double deviation(int* a, int n){
	if (a==NULL || n<1)	return -1.0;
	int sumX= 0;
	double EX=0;
	for ( int i= 0; i < n; i++ ){
		sumX+= a[i];
	}
	EX = sumX* 1.0/n;
	double sum2= 0.0;
	for ( int i= 0; i < n; i++ ){
		sum2+= (a[i]-EX)*(a[i]-EX);
	}
	return sum2/n;
}
//一次遍历，求其方差，公式：DX2= E(X2)-(EX)2
double deviation2(int* a, int n){
	if (a==NULL || n<1)	return -1.0;
	double sumX= 0.0;
	double sumX2= 0.0;
	for ( int i= 0; i < n; i++ ){
		sumX+= a[i];
		sumX2+= a[i]*a[i];
	}
	return sumX2/n- (sumX/n)*(sumX/n);
}
int main()
{
	int a[10]= {5,8,12,19,21,87,5,56,7,9};
	cout<<deviation(a, 10);
	cout<<endl;
	cout<<deviation2(a, 10);
	
	system("pause");
	return 0;
}